/*
 * ViewManager.cpp
 *
 *  Created on: Nov 7, 2013
 *      Author: ruben
 */

#include "ViewManager.h"
#include <stdlib.h>
#include <iostream>
#include <string.h>
using namespace std;
#define kUserType 0
#define kProviderType 1
#define kAdminType 2

ViewManager::ViewManager() {}

ViewManager::~ViewManager() {}


//admin

int ViewManager::recoverPasswordView() {
	int userID;
	char pass[32];
	int resp;
	//Limpiamos la pantalla
	system("clear");
	printf("     ---MODERAR CONSULTAS---\n");

	printf("Ingrese Identifiador del Usuario:");
	scanf("%d",&userID);
	while(getchar()!='\n');

	resp = entityManager->recoverPasswordUserByIdentier(userID,pass);
	if (resp == EXIT_SUCCESS) {
		printf("clave del usuario %d es: %s\n",userID,pass);
		return EXIT_SUCCESS;
	}
	printf("Usuario %d no encontrado!!\n",userID);
	return EXIT_FAILURE;
}
int ViewManager::moderateConsultationsView() {
	int resp;
		int consultingID;
		char deleteResp[2];
		//Limpiamos la pantalla
		system("clear");
		printf("     ---MODERAR CONSULTAS---\n");

		printf("Ingrese Identifiador de Consulta:");
		scanf("%d",&consultingID);
		while(getchar()!='\n');

		do {
			printf("ocultar consulta [Y/N]?: ");
			scanf("%s1",deleteResp);
			while(getchar()!='\n');

		}while(strcmp(deleteResp,"Y") and strcmp(deleteResp,"y") and strcmp(deleteResp,"N") and strcmp(deleteResp,"n"));

		if (strcmp(deleteResp,"Y") or strcmp(deleteResp,"y")) {
			resp = entityManager->hideConsulting(consultingID);
		}
		if (resp == 0) {
			printf("Consulta oculta satisfactoriamente!!!\n");
			return EXIT_SUCCESS;
		}
		printf("La Consulta no pudo ser modificada!!!\n");
		return EXIT_FAILURE;
}

int ViewManager::deleteCategoryView() {
	int resp;
	int categoryID;
	char deleteResp[2];
	//Limpiamos la pantalla
	system("clear");
	printf("     ---BAJA CATEGORIA---\n");

	printf("Ingrese Identifiador de Categoria:");
	scanf("%d",&categoryID);
	while(getchar()!='\n');
	do {
		printf("dar de baja como Categoria [Y/N]?: ");
		scanf("%s1",deleteResp);
		while(getchar()!='\n');

	}while(strcmp(deleteResp,"Y") and strcmp(deleteResp,"y") and strcmp(deleteResp,"N") and strcmp(deleteResp,"n"));

	if (strcmp(deleteResp,"Y") or strcmp(deleteResp,"y")) {
		resp = entityManager->deleteCategory(categoryID);
	}
	if (resp == 0) {
		printf("Categoria dada de baja satisfactoriamente!!!\n");
		return EXIT_SUCCESS;
	}
	printf("La categoria no pudo ser dado de baja como!!!\n");
	return EXIT_FAILURE;
}

int ViewManager::modifyCategoryView() {
	int resp;
	int categoryID;
	char name[100];
	char description[300];
	//Limpiamos la pantalla
	system("clear");
	printf("     ---MODIFICAR CATEGORIA---\n");

	printf("Ingrese EL Identificador de Categoria:");
	scanf("%d",&categoryID);
	while(getchar()!='\n');
	resp = entityManager->lookingForCategory(&categoryID);
	if (resp == EXIT_SUCCESS) {
		printf("Nuevo Nombre: \n");
		gets(name);
		printf("Nueva Descripcion: \n");
		gets(description);

		resp = entityManager->modifyCategory(categoryID, name,description);
		if(resp == EXIT_SUCCESS) {
			printf("Categoria Modificada!!!\n");
			return EXIT_SUCCESS;
		} else {
			printf("La categoria no pudo ser Modificada!!");
		}

	} else {
		printf("Categoria no encontrada!!");
	}

	return EXIT_FAILURE;
}

int ViewManager::newCategoryByFileView(int admin) {
	char filePath[100];

	//Limpiamos la pantalla
	system("clear");
	printf("     ---CREAR CATEGORIA---\n");
	printf("Direccion de archivo: ");
	gets(filePath);
	while(getchar()!='\n');
	int resp = entityManager->createCategoryByFile(filePath);

	if (resp == EXIT_FAILURE) {
		printf("No pudo crearse las Categorias!!!\n");
		return EXIT_FAILURE;
	}
	printf("Categorias creada!!!\n");
	return EXIT_SUCCESS;
}

int ViewManager::newCategoryView(int adminID) {
	char name[100];
	char description[300];

	//Limpiamos la pantalla
	system("clear");
	printf("     ---CREAR CATEGORIA---\n");
	printf("Nombre: ");
	gets(name);
	printf("Descripcion: ");
	gets(description);
	while(getchar()!='\n');

	int resp = entityManager->createCategory(name,description);

	if (resp == EXIT_FAILURE) {
		printf("No pudo crearse esta Categoria!!!\n");
		return EXIT_FAILURE;
	}


	printf("Categoria creada!!!\n");
	return EXIT_SUCCESS;
}

int ViewManager::createCategoryView(int adminIdentifier) {
	//Variable para las opciones
	int opcion;
	int resp = 0;
	//Ciclo
	do {
		//Presentamos el menú
		printf("----ALTA CATEGORIA----\n");
		printf("1 )  Alta manual\n");
		printf("2 )  Alta desde un archivo \n");
		printf("3 )  Volver \n");

		//Solicitamos la opción
		printf("     Ingrese opcion >> ");
		scanf("%d",&opcion);
		while(getchar()!='\n');
		//Definimos acciones para el menu

		switch (opcion) {
			case 1:
				printf("Opcion 1\n");
				resp = newCategoryView(adminIdentifier);
				break;
			case 2:
				printf("Opcion 2\n");
				resp = newCategoryByFileView(adminIdentifier);
				break;
			default:
				break;
		}
	} while(opcion != 3);
	//Salimos del menu y mostramos el fin
	return resp;
}

int ViewManager::deleteAdministratorView(int identifier) {
	int resp;
	int userID;
	char changeResp[2];
	//Limpiamos la pantalla
	system("clear");
	printf("     ---BAJA ADMINISTRADOR---\n");

	printf("Ingrese el DNI del Administrador:");
	scanf("%d",&userID);
	while(getchar()!='\n');
	do {
		printf("dar de baja como Administrador [Y/N]?: ");
		scanf("%s1",changeResp);

	}while(strcmp(changeResp,"Y") and strcmp(changeResp,"y") and strcmp(changeResp,"N") and strcmp(changeResp,"n"));

	if (strcmp(changeResp,"Y") or strcmp(changeResp,"y")) {
		resp = entityManager->deleteUserAdministrator(identifier);
	}
	if (resp == 0) {
		printf("Usuario dado de baja como Administrador!!!\n");
		return EXIT_SUCCESS;
	}

	printf("El Usuario no pudo ser dado de baja como Administrador!!!\n");
	return EXIT_FAILURE;

}

int ViewManager::resgisterUserToAdministratorView(int identifier) {
	int resp;
	int userID;
	char changeResp[2];
	//Limpiamos la pantalla
	system("clear");
	printf("     ---ALTA ADMINISTRADOR---\n");

	printf("Ingrese el DNI del Usuario:");
	scanf("%d",&userID);
	while(getchar()!='\n');
	do {
		printf("dar de alta como Administrador [Y/N]?: ");
		scanf("%s1",changeResp);
		while(getchar()!='\n');

	}while(strcmp(changeResp,"Y") and strcmp(changeResp,"y") and strcmp(changeResp,"N") and strcmp(changeResp,"n"));

	if (strcmp(changeResp,"Y") or strcmp(changeResp,"y")) {
		resp = entityManager->changeUserToAdministrator(identifier);
	}
	if (resp == 0) {
		printf("Usuario Modificado!!!\n");
		return EXIT_SUCCESS;
	}

	printf("El Usuario no pudo ser Modificado!!!\n");
	return EXIT_FAILURE;

}
//0 user, 1 provider, 2 admin, default User
int ViewManager::loginView(int type, int *identifier) {
	int pId;
	char pass[32];
	//char name[100];
	int resp;
	char typeName[100];
	int iType;
	switch (type) {
		case 1:
			strcpy(typeName,"Proveedor");
			iType = 1;
			break;
		case 2:
			strcpy(typeName,"Administrador");
			iType = 2;
			break;
		default:
			strcpy(typeName,"User");
			iType = 0;
			break;
	}

	//Presentamos el menú
	printf("Para realizar esta accion necesita identificarse como %s\n",typeName);
	printf("DNI :  ");
	scanf("%d",&pId);
	while(getchar()!='\n');
	//printf("Nombre :  ");
	//scanf("%s",name);
	printf("Password :  ");
	gets(pass);
	//TODO validar nombre y contrasenia en caso de Lograrlo cargo el menu de de usuario
	//0:logeado como usuario,
	//int pId;
	resp = entityManager->lookingForUserByIdentifier(pId,/*name,*/pass,iType);
	if (resp != EXIT_SUCCESS) {
		printf("Usted no tiene permisos para relizar esta accion, volvera al menu anterior\n");
		return EXIT_FAILURE;
	}
	identifier = &pId;
	return EXIT_SUCCESS;
}
//provider
int ViewManager::answerConsultations() {
	int resp;
	int consultingID;
	char answer[300];

	//Limpiamos la pantalla
	system("CLEAR");
	printf("     ---RESPONDER CONSULTA---\n");
	printf("ingrese el numero de identificacion del la Consulta: ");
	scanf("%d",&consultingID);
	while(getchar()!='\n');
	resp = entityManager->lookingForConsultingByIdentifier(consultingID);

	if (resp == 0) {
		printf("Respuesta: \n");
		gets(answer);

		resp = entityManager->updateConsultingWith(consultingID,answer);
	}

	if (resp == 0) {
		printf("Consulta Respondida!!!\n");
		return EXIT_SUCCESS;
	}
	return EXIT_FAILURE;
}
int ViewManager::deleteServiceView() {
	int resp;
	int deleteResp;
	//Limpiamos la pantalla
	system("clear");
	printf("     ---ELIMINAR SERVICIO---\n");
	printf("ingrese el numero de identificacion del Servicio: ");
	scanf("%d",&deleteResp);
	while(getchar()!='\n');

	resp = entityManager->lookingForServiceByIdentifier(deleteResp);
	if (resp == 0) {
		resp = entityManager->deleteServiceByIdentifier(deleteResp);
	}

	if (resp == 0) {
		printf("Servicio Eliminado!!!\n");
		return EXIT_SUCCESS;
	}

	printf("El Servicio no pudo ser Eliminado!!!\n");
	return EXIT_FAILURE;
}

int ViewManager::loginProviderView(int *identifier) {
	int pId;
	char pass[32];
	int resp;

	//Presentamos el menú
	printf("Para realizar esta accion necesita identificarse como Proveedor\n");
	printf("DNI :  ");
	scanf("%d",&pId);
	while(getchar()!='\n');
	printf("Password :  ");
	gets(pass);
	//TODO validar nombre y contrasenia en caso de Lograrlo cargo el menu de de usuario
	//0:logeado como usuario, 1 logeado como proveedor, 2 logeado como admin, -1 mal login
	//int pId;
	resp = entityManager->lookingForUserIdentifier(pId,/*name,*/ pass);
	if (resp!=1) {
		printf("Usted no tiene permisos para relizar esta accion, volvera al menu anterior\n");
		return EXIT_FAILURE;
	}
	*identifier = pId;
	return EXIT_SUCCESS;
}

int ViewManager::enlistAsProvider(int identifier) {
	int resp;
		char changeResp[2];
		//Limpiamos la pantalla
		system("clear");
		printf("     ---MODIFICAR USUARIO---\n");
		do {
			printf("dar de alta como proveedor [Y/N]?: ");
			scanf("%s1",changeResp);
			while(getchar()!='\n');
		}while(strcmp(changeResp,"Y") and strcmp(changeResp,"y") and strcmp(changeResp,"N") and strcmp(changeResp,"n"));

		if (strcmp(changeResp,"Y") or strcmp(changeResp,"y")) {
			resp = entityManager->changeUserToProvider(identifier);
		}
		if (resp == 0) {
			printf("Usuario Modificado!!!\n");
			return EXIT_SUCCESS;
		}

		printf("El Usuario no pudo ser Modificado!!!\n");
		return EXIT_FAILURE;
	return EXIT_SUCCESS;
}

int ViewManager::createServiceView(int providerIdentifier) {
	char name[100];
	char description[300];
	char type[2];

	//Limpiamos la pantalla
	system("clear");
	printf("     ---CREAR SERVICIO---\n");
	printf("Nombre: ");
	gets(name);
	printf("Descripcion: ");
	gets(description);
	printf("Tipo: ");
	gets(type);
	int resp = entityManager->createService(providerIdentifier,name,description,type);

		if (resp == 0) {
			printf("Servicio creado correctamente!\n");
			return EXIT_SUCCESS;
		}

		printf("No pudo crear usuario!!");
		return EXIT_FAILURE;
}

//user

int ViewManager::makeConsulting(int userIdentifier) {

	int seviceIdentifier, resp;
	char consulting[300];
	//Limpiamos la pantalla
	system("clear");
	printf("     ---CREAR CONSULTA---\n");
	printf("Identificador de Servicio: ");
	scanf("%d",&seviceIdentifier);
	while(getchar()!='\n');
	printf("Consulta: ");
	gets(consulting);
	resp = entityManager->createConsulting(userIdentifier,seviceIdentifier,consulting);
	if (resp == EXIT_SUCCESS) {
		printf("consulta creada!!!\n");
		return EXIT_SUCCESS;
	}
	printf("error! consulta no creada!!\n");
	return EXIT_FAILURE;
}
int ViewManager::deleteUserView(int identifier) {
	int resp;
	char deleteResp[2];
	//Limpiamos la pantalla
	system("clear");
	printf("     ---ELIMINAR USUARIO---\n");
	do {
		printf("eliminar usuario [Y/N]?: ");
		scanf("%s1",deleteResp);
		while(getchar()!='\n');
	}while(strcmp(deleteResp,"Y") and strcmp(deleteResp,"y") and strcmp(deleteResp,"N") and strcmp(deleteResp,"n"));

	if (strcmp(deleteResp,"Y") or strcmp(deleteResp,"y")) {
		resp = entityManager->eliminarUsuario(identifier);
	}
	if (resp == 0) {
		printf("Usuario Eliminado!!!\n");
		return EXIT_SUCCESS;
	}

	printf("El Usuario no pudo ser Eliminado!!!\n");
	return EXIT_FAILURE;
}

int ViewManager::modifyUserView(int oldDni) {
	int newDni;
	char newName[100];
	char newLastName[100];
	char newEmail[300];
	char newPass[32];
	char newProvince[32];
	//Limpiamos la pantalla
	system("clear");
	printf("     ---MODIFICAR USUARIO---\n");
	printf("Nuevo DNI: ");
	scanf("%d",&newDni);
	while(getchar()!='\n');
	printf("Nuevo Nombre: ");
	gets(newName);
	printf("Nuevo Apellido: ");
	gets(newLastName);
	printf("Nuevo Email: ");
	gets(newEmail);
	printf("Nuevo Password: ");
	gets(newPass);
	printf("Nuevo Password: ");
	gets(newProvince);
	int resp = entityManager->modifyUser(oldDni,newDni,newName, newLastName, newEmail, newPass, newProvince);
	while(getchar()!='\n');
	if (resp == 0) {
		printf("\nUsuario modificado correctamente!\n");
		return EXIT_SUCCESS;
	}

	printf("\nNo pudo modificar el usuario!!");
	return EXIT_FAILURE;
}

int ViewManager::createUserView() {
	int dni;
	char name[100];
	char lastName[100];
	char email[300];
	char pass[32];
	char province[100];
	char type;

	//Limpiamos la pantalla
	system("clear");
	printf("     ---CREAR USUARIO---\n");
	printf("DNI: ");
	scanf("%d",&dni);
	while(getchar()!='\n');
	printf("Nombre: ");
	gets(name);
	printf("Apellido: ");
	gets(lastName);
	printf("Email: ");
	gets(email);
	printf("Password: ");
	gets(pass);
	printf("Province: ");
	gets(province);
	printf("Tipoe: ");
	scanf("%c",&type);
	while(getchar()!='\n');

	int resp = entityManager->createUser(dni,name, lastName, email, pass, province, type);

	if (resp == 0) {
		printf("\nUsuario creado correctamente!\n");
		return EXIT_SUCCESS;
	}

	printf("\nNo pudo crear usuario!!\n");
	return EXIT_FAILURE;
}


int ViewManager::initView() {
	//Variable para las opciones
	    int opcion;
	    //Ciclo
	    do
	    {
	    	//Presentamos el menú
	    			printf("     PANTALLA INICIAL\n");
	    			printf("     ---GENERAL---\n");
	    			printf("1 )  Registrar Usuario\n");
	    			printf("2 )  Modificar Datos\n");
	    			printf("3 )  Eliminar Usuario\n");
	    			printf("4 )  Consultar Servicios\n");//falta
	    			printf("5 )  Realizar Consultas\n");//falta
	    			printf("\n");
	    			printf("     ----PROVEEDOR---\n");
	    			printf("6 )  Registrar Usuario como Proveedor\n");
	    			printf("7 )  Crear Servicio\n");
	    			printf("8 )  Eliminar Servicio\n");
	    			printf("9 )  Asociar Servicio A Categoria\n");//falta
	    			printf("10 )  Responder Consultas\n");

	    			printf("     ----ADMINISTRADORES---\n");
	    			printf("11 )  Regsitrar Usuario como Administrador\n");
	    			printf("12 )  Eliminar Usuario como Administrador\n");
	    			printf("13 )  Crear Categoria\n");
	    			printf("14 )  Modificar Categoria\n");
	    			printf("15 )  Eliminar Categoria\n");
	    			printf("16 )  Moderar Consultas\n");
	    			printf("17 )  Recuperar Contraseña\n");

	    			printf("18 )  Salir\n");
	        //Solicitamos la opción
	        printf("     Ingrese opcion >> ");
	        scanf("%d",&opcion);
	        while(getchar()!='\n');
	        //Definimos acciones para el menu
	        int identifier;
	        switch (opcion) {
				case 1:
					printf("Opcion 1\n");
					createUserView();
					break;
				case 2:
					printf("Opcion 2\n");
					if (loginToUpdate(&identifier) != EXIT_FAILURE) {
						modifyUserView(identifier);
					}
					break;
				case 3:
					printf("Opcion 3\n");
					if (loginToUpdate(&identifier) != EXIT_FAILURE) {
						deleteUserView(identifier);
					}
					break;
				case 5:
					printf("Opcion 5\n");
					if (loginView(kUserType, &identifier) != EXIT_FAILURE) {
						makeConsulting(identifier);
					}
					break;
				case 6:
					printf("Opcion 6\n");
					if (loginToUpdate(&identifier) != EXIT_FAILURE) {
						enlistAsProvider(identifier);
					}
					break;
				case 7:
					printf("Opcion 7\n");
					if (loginProviderView(&identifier) != EXIT_FAILURE) {
						createServiceView(identifier);
					}
					break;
				case 8:
					printf("Opcion 8\n");
					if (loginProviderView(&identifier) != EXIT_FAILURE) {
						deleteServiceView();
					}
					break;
				case 10:
					printf("Opcion 10\n");
					if (loginProviderView(&identifier) != EXIT_FAILURE) {
						answerConsultations();
					}
					break;
				case 11:
					printf("Opcion 11\n");
					if (loginView(kAdminType, &identifier) != EXIT_FAILURE) {
						resgisterUserToAdministratorView(identifier);
					}
					break;
				case 12:
					printf("Opcion 12\n");
					if (loginView(kAdminType, &identifier) != EXIT_FAILURE) {
						deleteAdministratorView(identifier);
					}
					break;
				case 13:
					printf("Opcion 13\n");
					if (loginView(kAdminType, &identifier) != EXIT_FAILURE) {
						createCategoryView(identifier);
					}
					break;
				case 14:
					printf("Opcion 14\n");
					if (loginView(kAdminType, &identifier) != EXIT_FAILURE) {
						modifyCategoryView();
					}
					break;
				case 15:
					printf("Opcion 15\n");
					if (loginView(kAdminType, &identifier) != EXIT_FAILURE) {
						deleteCategoryView();
					}
					break;
				case 16:
					printf("Opcion 16\n");
					if (loginView(kAdminType, &identifier) != EXIT_FAILURE) {
						moderateConsultationsView();
					}
					break;
				case 17:
					printf("Opcion 17\n");
					if (loginView(kAdminType, &identifier) != EXIT_FAILURE) {
						recoverPasswordView();
					}
					break;
				default:
					break;
			}
	        pressAnyKeyToContinue();
	    }
	    while(opcion != 18);
	    //Salimos del menu y mostramos el fin
	    printf("FIN\n");
	    //Pausamos para que se vea el resultado de la linea anterior.
	    cout << "Press enter to continue ...";
	    cin.ignore().get();
	    //salimos
	    return EXIT_SUCCESS;
}

int ViewManager::loginToUpdate(int *identifier) {
	int pId;
	char pass[32];
	int resp;

	//Presentamos el menú
	printf("Para realizar esta accion necesita identificarse\n");
	printf("DNI :  ");
	scanf("%d",&pId);
	while(getchar()!='\n');
	printf("Password :  ");
	gets(pass);
	//TODO validar nombre y contrasenia en caso de Lograrlo cargo el menu de de usuario
	//0:logoado como usuario, 2 logeado como admin, 3 logeado como prove, -1 mal login
	//int pId;
	resp = entityManager->lookingForUserIdentifier(pId,/*name, */pass);
	if (resp!=0) {
		printf("usuario o contrasenia incorectos, va a volver al menu anterior\n");

	}
	identifier = &pId;
	return (resp != 0) ? EXIT_FAILURE : EXIT_SUCCESS;

}

int ViewManager::loginView() {
	char pass[32];
	char name[100];
	int resp;

	//Presentamos el menú
	printf("Para realizar esta accion necesita identificarse\n");
	printf("Nombre :  ");
	gets(name);
	printf("Password :  ");
	gets(pass);
	//TODO validar nombre y contrasenia en caso de Lograrlo cargo el menu de de usuario
	//0:logoado como usuario, 2 logeado como admin, 3 logeado como prove, -1 mal login
	resp = entityManager->loginUser(name, pass);
	if (resp == -1) {
		printf("usuario o contrasenia incorectos, va a volver al menu anterior\n");
		return EXIT_FAILURE;
	}
	return EXIT_SUCCESS;

}

void ViewManager::pressAnyKeyToContinue() {
	cout << "Press enter to continue ...";
	cin.ignore().get();
}




